10 REM CHECK/RE-ALIGN A 1541 20 : 30 REM SEE PROTOTYPE AND INSTRUCTIONS IN 40 REM G. NEUFELD'S "1541 USER'S GUIDE" SECTION 12.5 50 REM REWRITE BY DAVE WALTON 60 PRINT"[147] 1541 ALIGNMENT" 70 PRINT" INSERT STANDARD DISK" 80 DIM E$(16) 90 D=8:REM DRIVE # 100 SID=54272:Z$=CHR$(0):DC$=Z$+CHR$(28)+CHR$(1) 110 FORI=SIDTOSID+23:POKEI,0:NEXT 120 POKEI,15:POKESID+5,9 130 E$(0)=" " 140 E$(1)="OK " 150 E$(2)="CLOSE TO HALFWAY " 160 E$(3)="HALFWAY (NO DATA FOUND)" 170 E$(9)="CLOSE TO HALFWAY " 180 C$="":FORI=1TO11:READ A:C$=C$+CHR$(A):NEXT 190 PRINT" PRESS ANY KEY TO START" 200 GETA$:IFA$="" THEN200 210 OPEN 5,D,15 220 REM SEND MACHINE CODE TO DRIVE 230 REM (JUMP JOB RUNS IN BUF #0) 240 PRINT#5,"M-W"Z$CHR$(3)CHR$(11)C$ 280 : 290 REM SEND "INIT DISK" CMD TO DRIVE 300 PRINT#5,"I":PRINT"[147]":T=18 380 : 390 REM NEW TRACK - SHOW "??" 400 E=0 480 : 490 REM READ THE DISK CONTROLLER PORT 500 PRINT#5,"M-R"DC$ 510 GET#5,A$:A=ASC(A$+Z$) 520 CV=3ANDA 530 A=(159ANDA)OR(100+32*((T>17)+(T>24)+(T>30))) 540 PRINT#5,"M-W"DC$CHR$(A) 580 : 590 REM DISPLAY VALUES 600 T$=STR$(TR):S$=STR$(SE):IF E<>1 THEN T$="??":H1$="?":H2$="?":S$="??" 610 PRINT" ALIGN THE 1541 DRIVE" 620 PRINT"TRACK POSITION:"T"[157] " 630 PRINT"TRACK # READ: "RIGHT$(T$,2) 640 PRINT"SECTOR # READ: "RIGHT$(S$,2) 650 PRINT"DISK ID READ: "H1$;H2$ 660 PRINT"READ RESULTS:"E$(E) 680 : 700 PRINT"COMMANDS:" 710 PRINT" F1 = MOVE HEAD OUT (LOWER TRACK #) 720 [153]" F2 = MOVE HEAD TO TRACK 1 730 PRINT" F3 = MOVE HEAD IN (HIGHER TRACK #) 740 [153]" F4 = MOVE HEAD TO TRACK 35 750 PRINT" F5 = INITIALIZE (TO TRACK 18)" 760 PRINT" F7 = END PROGRAM" 780 : 790 REM CHECK KEYBOARD 800 GETA$:K=ASC(A$+Z$)-132 810 IFK>0THEN ONKGOTO1300,1320,300,1800,1340,1360 860 : 870 REM ATTEMPT TO READ ANY HEADER 880 : 890 REM PUT JMP JOB IN THE JOB QUEUE 900 PRINT#5,"M-W"Z$Z$CHR$(1)CHR$(208) 980 : 990 REM CHECK RESULTS 1000 PRINT#5,"M-R"Z$Z$ 1010 GET#5,A$:E=ASC(A$+Z$) 1020 REM "E" IS FDC ERROR CODE RETURNED 1030 IFE=3 THEN FH=20:GOTO 1200 1040 IFE=2 OR E=9 THEN FH=30:GOTO1200 1050 IFE<>1 THEN400 1080 : 1090 REM READ OK; GET ID, TRACK, SECTOR 1100 PRINT#5,"M-R"CHR$(22)Z$CHR$(4) 1110 GET#5,H1$,H2$,H3$,H4$ 1120 TR=ASC(H3$+Z$) 1130 SE=ASC(H4$+Z$) 1140 GOTO500 1180 : 1190 REM BOING SOUND 1200 POKESID+4,0 1210 POKESID+1,FH 1220 POKESID+4,17 1230 GOTO500 1280 : 1290 REM MOVE HEAD IN OR OUT 1300 IFT>1 THEN1500 1310 GOTO900 1320 IFT<40 THEN C=1:GOTO1510 1330 GOTO900 1340 IFT>1 THEN C=-1:L=2*(T-1):GOTO1400 1350 GOTO900 1360 IFT<35 THEN C=1:L=2*(35-T):GOTO1400 1370 IFT=35 THEN900 1380 C=-1:L=2*(T-35) 1400 FORI=1TOL:GOSUB1600:NEXT:GOTO400 1500 C=-1 1510 GOSUB1600:GOTO400 1580 : 1590 REM MOVE HEAD ONE HALF-TRACK 1600 T=T+C*.5 1610 CV=(CV+C)AND3:A=(252ANDA)+CV 1620 PRINT#5,"M-W"DC$CHR$(A):RETURN 1780 : 1790 REM END PROGRAM (TURN DRIVE OFF) 1800 PRINT#5,"M-W"DC$CHR$(240) 1810 FORI=SID TOSID+23:POKEI,0:NEXT 1820 FORJ=1TO100:NEXTJ:POKEI,0 1830 CLOSE5:END 2000 : 2010 REM MACHINE CODE ROUTINE TO READ A HEADER 2020 REM RESIDES AT $0300 (BUFFER #0) 2030 DATA 169,48: :REM LDA #$30 2040 DATA 133,69: :REM STA $45 2050 DATA 169,00: :REM LDA #$00 2060 DATA 133,63: :REM STA $3F 2070 DATA 76,177,243 :REM JMP $F3B1